<?php
require "./function.php";
/**
 * @Author: Wherein
 * @Date: 2021-03-24 09:31
 * @covers 单例模式
 * @example 使用场景: 私有化一个属性用于存放唯一的一个实例
 * 2，私有化构造方法，私有化克隆方法，用来创建并只允许创建一个实例
 * 3，公有化静态方法，用于向系统提供这个实例
 */
class Singleton {
    // 存放实例
    private static $_instance;

    
    // 私有化构造方法
    private function __construct() {
        dd('单例模式的实例被构造了');
    }

    // 私有化克隆方法
    private function __clone() {
        // TODO: Implement __clone() method.
        echo 'I am clone';
    }

    /*
     * instanceof
     * 实例是否某个特定的类型
     * 实例是否从某个特定的类型继承
     * 实例或者他的任何祖先类是否实现了特定的接口
     */
    public static function getInstance() {
        // 判断系统是否已经有这个单例，如果有则返回，如果没有则创建。
        if (!(self::$_instance instanceof Singleton)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }

    public function setname($name) {
        $this->name[] = $name;
    }
    public function getname() {
        return $this->name;
    }
}

// test
$S = Singleton::getInstance();
$S->setname('wherein');
$S->setname(23);
var_dump($S->getname());